﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Observer
{

    //通知接口
    public interface INotify
    {
        void SendMessage(string str);
    }

    public class AccountObserverd
    {
        List<INotify> Notifies = new List<INotify>();

        private decimal AccountBalance = decimal.MinValue;

        public AccountObserverd(decimal initMoeny)
        {
            AccountBalance = initMoeny;
        }
        //添加一个观察者
        public void AddObserver(INotify notify)
        {
            this.Notifies.Add(notify);
        }

        //去除一个观察者
        public bool Remove(int index)
        {
            if (index > this.Notifies.Count - 1)
            {
                return false;
            }
            this.Notifies.RemoveAt(index);
            return true;
        }

        /// <summary>
        /// 当账户余额发生改变通知观察者
        /// </summary>
        public bool ChangeBalance(decimal money)
        {
            if (AccountBalance + money < 0)
            {
                return false;
            }
            string strMgs = string.Format("账户余额发生变化:变化前{0}，变化后{1},变化金额：{2}", this.AccountBalance, AccountBalance + money, money);
            this.AccountBalance = AccountBalance + money;
            //发送通知信息
            this.Notifies.ForEach(ret => ret.SendMessage(strMgs));
            return true;
        }

    }

    //手机观察者
    public class AppObserver : INotify
    {
        //其他的关于手机的一些方法和业务


        public void SendMessage(string str)
        {
            Console.WriteLine("手机平台收到账户通知信息：{0}",str);
        }
    }

    //电脑观察者
    public class PcObserver : INotify
    {
        //电脑的一些其他业务
        public void SendMessage(string str)
        {
            Console.WriteLine("电脑收到账户余额变动信息：{0}",str);
        }
    }

    //其他的观察者，只要能够实现INotify 接口就行  


}
